#include <stdio.h>
#include <assert.h>
#include <string.h>
//模拟实现memcpy 功能
// #include <assert.h>
// void* my_memcpy(void* dest,const void* str,size_t num)
// {
//     assert(dest && str);
    // 这里 void* 是泛型指针
    // *dest=*str; 原理是这样的
    // 考虑到参数类型都是void* 原因是因为传入实参的类型不固定
    // 所以为了保证无论什么类型都能拷贝成功 必须要强制类型转换为char*
//     void* ret=(void*)dest;//记录初始位置
//     while(num--)
//     {
//         *(char*)dest=*(char*)str;
//         dest=(char*)dest+1;
//         str=(char*)str+1;
//     }
//     return ret;
//#############################
//memmove函数 实现重叠拷贝 一些编译器里的memcpy函数也可以实现重叠拷贝
//c 语言标准里把两者区分开 
//########################
//
// void* my_memmove(void* dest,const void* src,size_t num)
// {
//     assert(dest && src);
//     void* ret=dest;
//     if(src<dest)
//     {
//         //后-前
//         while(num--)
//         {
//             *((char*)dest+num)=*((char*)src+num);
//         }
//     }
//     else
//     {
//         //前-后
//         while(num--)
//         {
//             *(char*)dest=*(char*)src;
//             dest=(char*)dest+1;
//             src=(char*)src+1;
//         }
       
//     }
//     return ret;
// }
// int main()
// {
//     int arr[]={1,2,3,4,5,6,7,8,9,10};
//     //arr【】={1,2,1,2,3,4,7,8,9,10};
//     int *ret=my_memmove(arr+4,arr,16);

//     for(int i=0;i<10;i++)
//     {
//         printf("%d ",arr[i]);
//     } 
//     return 0;
// }
//memecmp 函数
// int main()
// {
//     int arr[]={1,2,3};
//     int arr1[]={2};
//     int ret=memcmp(arr,arr1,4);
//     printf("%d\n",ret);
//     return 0;
// }
//memset 函数
// int main()
// {
//     char str[]="zhaojiahao bit";
//     memset(str,'x',4);
//     printf("%s\n",str);
//     return 0;
// }
// int main()
// {
//     int arr[10]={0};
//     memset(arr,1,40);
//     for(int i=0;i<10;i++)
//     {
//          printf("%d\n",arr[i]);
//     }
//     return 0;
// }
//这里可以发现，利用memset 使得arr数组里每个元素的每个字节都变成1
//所以 memste 无法完成对数组统一设置值的功能
